﻿#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//int main()
//{
//	int a = 0x11223344;
//	printf("%p", &a);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10;
//	int* pa = &a;//取出a的地址并存储到指针变量pa中
//
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 100;
//	int* pa = &a;
//	*pa = 0;
//	printf("%d", a);
//	return 0;
//}

#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位（即4个字节）
//64位平台下地址是64个bit位（即8个字节）

//int main()
//{
//	int const a = 0;
//	printf("%zd\n", sizeof(char*));
//	printf("%zd\n", sizeof(short*));
//	printf("%zd\n", sizeof(int*));
//	printf("%zd\n", sizeof(double*));
//	return 0;
//}

////代码1
//#include <stdio.h>
//int main()
//{
//	int a = 0x11223344;
//	int* pi = &a;
//	*pi = 0;
//
//	return 0;
//}

////代码2
//#include <stdio.h>
//int main()
//{
//	int a = 0x11223344;
//	char* pc = (char*) & a;
//	*pc = 0;
//
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10;
//	int* pa = &a;
//	char* pc = (char*)&a;
//	printf("pa = %p\n", pa);
//	printf("pc = %p\n", pc);
//	printf("pa+1 = %p\n", pa+1);
//	printf("pc+1 = %p\n", pc+1);
//
//	return 0;
//}
//
//#include <stdio.h>
//int main()
//{
//	int a = 10;
//
//	void* pa = &a;
//	void* pc = &a;
//	*pa = 10;//err
//	*pc = 20;//err void类型的指针不能直接进行解引用操作
//	pc++;//void* 类型的指针也不能+-1的操作
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int m = 0;
//	m = 20;//m是可以修改的
//	const int n = 0;//a不能被修改了，但是a的本质还是变量
//	n = 20; //n是不能被修改的，这样会报错
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	const int a = 10;
//	const int* pa = &a;
//	*pa = 0;
//	printf("%d", a);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	const int a = 10;
//	int  * const pa = &a;
//	*pa = 0;//ok
//	int b = 20;
//	//pa = &b; //err
//	printf("%d", a);
//	return 0;
//}
//
//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//使用指针打印数组的内容
//	int* p = &arr[0];
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", *p);
//		p++;
//	}
//}


//#include <stdio.h>
////指针+- 整数
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[9];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p - i));
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%d\n", &arr[0] - &arr[9]);
//}

//#include <stdio.h>
//
//size_t my_strlen(char* str)
//{
//	char* start = str;
//	while (*str != '\0')
//	{
//		str++;
//	}
//	return str - start;
//}
//
//size_t my_strlen(char* str)
//{
//	int count = 0;
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//int main()
//{
//	char arr[] = "abcd";
//	size_t ret = my_strlen(arr);
//	printf("%zd", ret);
//}

//#include <stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* pi = arr;
//	while (pi < arr + sz)
//	{
//		printf("%d ", *pi);
//		pi++;
//	}
//}

//指针的关系运算
//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	while (p < arr + sz) //指针的大小比较
//	{
//		printf("%d ", *p);
//		p++;
//	}
//	return 0;
//
//}

//#include <stdio.h>
//int main()
//{
//	int num = 10;
//	int* p1 = &num;
//	int* p2 = NULL;
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int* p;
//	*p = 20;
//	printf("%d\n", *p);
//	return 0;
//}
//
//#include <stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9 };
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}

//int* test()
//{
//	int a = 10;
//	return &a;
//}
//
//#include <stdio.h>
//int main()
//{
//	int* p = test();
//	printf("%d\n", *p);
//	return 0;
//}

int main()
{
	int arr[10] = { 1,2,3,4,5,67,7,8,9,10 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p++) = i;
	}
	//此时p已经越界了，可以把p置为NULL
	p = NULL;
	//下次使⽤的时候，判断p不为NULL的时候再使⽤
	//...
	p = &arr[0];//重新让p获得地址
	if (p != NULL) //判断
	{
		//...
	}
	return 0;
}